package org.assocsp3.dao.impl;

import java.sql.SQLException;
import java.util.List;

import org.assocsp3.dao.GenericDao;
import org.assocsp3.modele.Activite;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.context.annotation.Scope;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

/**
 * Les mappings sont faits avec des annotations sur la classe Activite
 * Les transaction sont déclarées par des annotations, dans GenericDao
 * Certaines méthodes sont en read-only : 
 * 			optimisation --> amélioration des performances de Hibernate :pas de flush
 */
@Scope(value="singleton")
public class ActiviteDaoImpl extends HibernateDaoSupport implements GenericDao<Activite>{

	public void add(Activite o) {
		getHibernateTemplate().merge(o);		
	}

	public void update(Activite o) {
		getHibernateTemplate().update(o);			
	}
	
	public void delete(Activite o) {
		getHibernateTemplate().delete(o);		
	}

	@SuppressWarnings("unchecked")
	public List<Activite> loadAll() {
		return getHibernateTemplate().find("from Activite a order by a.nom");
	}

	public Activite load(final int id, String islazy) {
		/* initialisation de l'objet sans ces associations*/
		if(!islazy.toLowerCase().equals("eager"))
			return (Activite) getHibernateTemplate().find("from Activite a where a.id = "+id).get(0);
        
		/*  initialisation selon les associations voulues :
		 *  ici les horaires --> Hibernate.initialize(a.getHoraires());
         */
		return (Activite)getHibernateTemplate().execute(new HibernateCallback() {
            public Object doInHibernate(Session session) throws HibernateException, SQLException {
                Query query = session.createQuery("from Activite a where a.id = "+id);
                Activite a = (Activite) query.uniqueResult();
                Hibernate.initialize(a.getHoraires());
                return a;
            }
        });
	}
	
    public Activite loadByName(final String s,String islazy) {
    	/* initialisation de l'objet sans ces associations*/
    	if(!islazy.toLowerCase().equals("eager"))
    		return (Activite) getHibernateTemplate().find("from Activite a where a.nom = \'"+s+"\'").get(0);
        
    	/*  initialisation selon les associations voulues
         * 	ici les horaires --> Hibernate.initialize(a.getHoraires());
         */
    	return (Activite)getHibernateTemplate().execute(new HibernateCallback() {
            public Object doInHibernate(Session session) throws HibernateException, SQLException {
                Query query = session.createQuery("from Activite a where a.nom = \'"+s+"\'");
                Activite a = (Activite) query.uniqueResult();
                Hibernate.initialize(a.getHoraires());
                return a;
            }
        });
    }   
        
}
